package lvm.fonctions.prim.subr;

import lvm.Contexte;
import lvm.LvmException;
import lvm.struct.*;
import lvm.fonctions.prim.fsubr.*;

public class Eq extends Subr {
	public static final Eq EQ = new Eq();
	
	public Eq() {
		super("eq");
	}
	
	/**
	 * Teste si deux Sexpr sont égales
	 * @param arg: La Liste des Sexpr à tester
	 * @return t si les Sexpr sont égales, Nil sinon
	 */
	public Sexpr exec(Sexpr arg) throws LvmException {
		Sexpr s1 = arg.getCar();
		//On décide d'évaluer ou non selon la présence de la quote
		if (s1.getCar() instanceof Symbole && Contexte.getContexteCourant().getPrimitive((Symbole)s1.getCar()) instanceof Quote)
			s1 = s1.getCdr();
		else
			s1 = s1.eval();
		
		Sexpr s2 = arg.getCdr().getCar();
		//On décide d'évaluer ou non selon la présence de la quote
		if (s2.getCar() instanceof Symbole && Contexte.getContexteCourant().getPrimitive((Symbole)s2.getCar()) instanceof Quote)
			s2 = s2.getCdr();
		else
			s2 = s2.eval();
		
		if (s1.equals(s2))
			return new Symbole("t");
		return Nil.NIL;
	}

}
